<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<!--[if lt IE 9]>
  <script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
<![endif]-->
<title>VIM 中文帮助: 编辑同一文本的两到八个版本</title>
<link rel="stylesheet" href="vim-stylesheet.css" type="text/css" />
<link rel="canonical" href="https://yianwillis.github.io/vimcdoc/doc/diff.html" />
<script type="text/javascript" src="vimcdoc.js"></script>
<meta name="viewport" content="width=device-width, initial-scale=1" />
</head>
<body>
<nav id=banner>
<form action=tags.html target="tag_iframe">
  <input type="text" name="tag" id="tag" placeholder="标签搜索">
</form>
<iframe name="tag_iframe" src=""></iframe>
<a href="help.html">帮助总览</a> &middot;
<hr/>
<a href="quickref.html">快速参考</a> &middot;
<a href="index.html">命令索引</a> &middot;
<a href="eval.html#functions">函数列表</a> &middot;
<a href="quickref.html#option-list">选项列表</a> &middot;
<hr/>
<a href="usr_toc.html">用户手册</a> &middot;
<a href="help.html#reference_toc">参考手册</a> &middot;
</nav>

<header>
<h2>diff</h2>
</header>
<article id=outer>
<section class=inner>
<b class="vimtag"> <a name="diff.txt">diff.txt</a> </b>      适用于 Vim 9.0 版本。   最近更新: 2023年2月


                  <code class="vim">VIM 参考手册    by Bram Moolenaar</code>
                                <code class="vim">译者</code>: Zimin&lt;cranecai@users.sf.net&gt;、tocer


                                <b class="vimtag"> <a name="diff">diff</a> </b> <b class="vimtag"> <a name="vimdiff">vimdiff</a> </b> <b class="vimtag"> <a name="gvimdiff">gvimdiff</a> </b> <b class="vimtag"> <a name="diff-mode">diff-mode</a> </b>
这篇文章描述  <a href="various.html#+diff">+diff</a>  特性: 比较同一文件的两到八个版本间的差异。

用户手册  <a href="usr_08.html#08.7">08.7</a>  节说明了一些比较基本的用法。

1. 进入比较模式                  <a href="diff.html#start-vimdiff">start-vimdiff</a> 
2. 查看比较结果                  <a href="diff.html#view-diffs">view-diffs</a> 
3. 跳转到差异文                  <a href="diff.html#jumpto-diffs">jumpto-diffs</a> 
4. 复制差异文本                  <a href="diff.html#copy-diffs">copy-diffs</a> 
5. diff 选项                     <a href="diff.html#diff-options">diff-options</a> 

</section><hr class="doubleline" /><section class=inner>
<h4>1. 进入比较模式                                         <b class="vimtag"> <a name="start-vimdiff">start-vimdiff</a> </b></h4>
进入比较模式编辑的最简单方法就是用 "vimdiff" 命令。它如常启动 Vim，但附加一些
设置，以便于查看输入参数所指定的文件间的差异: 
<code class="example"></code>
<code class="example">        vimdiff file1 file2 [file3 [file4]]</code>
<code class="example"></code>
这等同于: 
<code class="example"></code>
<code class="example">        vim -d file1 file2 [file3 [file4]]</code>
<code class="example"></code>
你也可以使用 "gvimdiff" 或 "vim -d -g" 以启动 GUI 的版本。
又或者，使用 "viewdiff" 或 "gviewdiff" 以启动只读模式。
"r" 可以附加在这些名字前面，用来进入受限模式 (参考  <a href="starting.html#-Z">-Z</a> )。

第二个及其后的参数也可以是目录名。Vim 将依据第一个参数所指定的文件名在指定目录
中查找另外的文件名。

缺省使用内部 diff 库。如果设置了 <a href="options.html#'diffopt'">'diffopt'</a> 或 <a href="options.html#'diffexpr'">'diffexpr'</a>，则使用外部的 "diff"
命令。只有这样的 diff 程序可用的时候才行。

窗口比较局部于当前标签页  <a href="tabpage.html#tab-page">tab-page</a>  中。你不能看到某窗口和别的标签页中的窗口的
差异。这样，可以同时打开多组比较窗口，每组差异在单独的标签页中。

Vim 将为每个文件打开一个窗口，并且就像使用  <a href="starting.html#-O">-O</a>  参数一样，使用垂直分割。如果你
要水平分割，加上  <a href="starting.html#-o">-o</a>  参数: 
<code class="example"></code>
<code class="example">        vimdiff -o file1 file2 [file3 [file4]]</code>
<code class="example"></code>
如果你喜欢总使用水平分割，在 <a href="options.html#'diffopt'">'diffopt'</a> 里包含 "horizontal"。

在每一个被编辑的文件中，以下选项被设定:

        <a href="options.html#'diff'">'diff'</a>          打开
        <a href="options.html#'scrollbind'">'scrollbind'</a>    打开
        <a href="options.html#'cursorbind'">'cursorbind'</a>    打开
        <a href="options.html#'scrollopt'">'scrollopt'</a>     包含 "hor"
        <a href="options.html#'wrap'">'wrap'</a>          关闭，<a href="options.html#'diffopt'">'diffopt'</a> 包含 "followwrap" 时保持不变
        <a href="options.html#'foldmethod'">'foldmethod'</a>    "diff"
        <a href="options.html#'foldcolumn'">'foldcolumn'</a>    来自 <a href="options.html#'diffopt'">'diffopt'</a> 的值，缺省为 2

这些参数仅设置于当前窗口。当编辑其它文件时，以上选项被重设回全局值。
不过，重新编辑文件时，仍然可以用模式行修改这些选项。但 <a href="options.html#'diff'">'diff'</a> 置位时，
<a href="options.html#'foldmethod'">'foldmethod'</a> 和 <a href="options.html#'wrap'">'wrap'</a> 不受模式行改变。
 <a href="diff.html#:diffoff">:diffoff</a>  提供了反转这样选项的简便办法。

比较基于缓冲区的内容。因而，如果在载入文件后你做过改动，这些改动也将参加比较。
不过，你也许要不时地使用 "diffupdate"。因为并非所有的改动的结果都能自动更新，
尤其是使用外部 diff 命令的时候。

在 .vimrc 文件中，你可以用以下的结构，对比较模式做专门的设定: 
<code class="example"></code>
<code class="example">        if &amp;diff</code>
<code class="example">           setup for diff mode</code>
<code class="example">        else</code>
<code class="example">           setup for non-diff mode</code>
<code class="example">        endif</code>
<code class="example"></code>
如果已在 Vim 中，你可以用三种方式进入比较模式。

                                                        <b class="vimtag"> <a name="E98">E98</a> </b>
:diffs[plit] <code class="special">{filename}</code>                                 <b class="vimtag"> <a name=":diffs">:diffs</a> </b> <b class="vimtag"> <a name=":diffsplit">:diffsplit</a> </b>
                对 <code class="special">{filename}</code> 开一个新窗口。当前的和新开的窗口将设定和
                "vimdiff" 一样的参数。另见 <a href="options.html#'diffexpr'">'diffexpr'</a>。

                                                        <b class="vimtag"> <a name=":difft">:difft</a> </b> <b class="vimtag"> <a name=":diffthis">:diffthis</a> </b>
:difft[his]     使当前窗口参与比较。本命令设定和 "vimdiff" 同样的选项。

:diffp[atch] <code class="special">{patchfile}</code>                         <b class="vimtag"> <a name="E816">E816</a> </b> <b class="vimtag"> <a name=":diffp">:diffp</a> </b> <b class="vimtag"> <a name=":diffpatch">:diffpatch</a> </b>
                使用当前的缓冲区，用 <code class="special">{patchfile}</code> 给它打上补丁并打开一个缓冲区
                显示结果。两个缓冲区都将设定为和 "vimdiff" 同样的参数。
                <code class="special">{patchfile}</code> 可以是任何一种 "patch" 程序认识的或 <a href="options.html#'patchexpr'">'patchexpr'</a> 可
                以处理的格式。
                <code class="note">注意</code>: <code class="special">{patchfile}</code> 只能包含一个文件的比较结果: 当前文件。如果
                <code class="special">{patchfile}</code> 也包含了其他文件的比较，结果将不可预知。Vim 改变当
                前目录到 /tmp， 以避免当前目录下的文件被意外的打补丁。但它仍不
                能避免若干 ".rej" 文件产生。当绝对路径名出现时，这些文件也不能
                避免被打补丁。

要垂直分割窗口，在前面加上  <a href="windows.html#:vertical">:vertical</a> 。例如: 
<code class="example"></code>
<code class="example">        :vert diffsplit main.c~</code>
<code class="example">        :vert diffpatch /tmp/diff</code>
<code class="example"></code>
如果你偏好垂直分割，可以在 <a href="options.html#'diffopt'">'diffopt'</a> 中包含 "vertical"。

                                                        <b class="vimtag"> <a name="E96">E96</a> </b>
最多可以对八个缓冲区设置 <a href="options.html#'diff'">'diff'</a> 模式。

因为选项的值是由缓冲区记录的，在编辑另一个文件后又回到此文件时，你仍会处于比较
模式。

                                                        <b class="vimtag"> <a name=":diffo">:diffo</a> </b> <b class="vimtag"> <a name=":diffoff">:diffoff</a> </b>
:diffo[ff]      为当前窗口关闭比较模式。即使 <a href="options.html#'diff'">'diff'</a> 没有置位，也复位相关选项。

:diffo[ff]!     为当前窗口和当前标签页所有置位 <a href="options.html#'diff'">'diff'</a> 的窗口关闭比较模式。只在
                在置位 <a href="options.html#'diff'">'diff'</a> 的窗口中才复位相关选项，如果当前窗口没有置位
                <a href="options.html#'diff'">'diff'</a>，不改变其任何选项。
                隐藏缓冲区也从参于比较的缓冲区列表中删除。

 <a href="diff.html#:diffoff">:diffoff</a>  命令复位相关选项到启用  <a href="diff.html#:diffsplit">:diffsplit</a> ， <a href="diff.html#:diffpatch">:diffpatch</a> ， <a href="diff.html#:diffthis">:diffthis</a>  之
前或以比较模式启动 Vim 时的值。
使用  <a href="diff.html#:diffoff">:diffoff</a>  两次恢复再上次的保存值。
否则复位其默认值如下:

        <a href="options.html#'diff'">'diff'</a>          关闭
        <a href="options.html#'scrollbind'">'scrollbind'</a>    关闭
        <a href="options.html#'cursorbind'">'cursorbind'</a>    关闭
        <a href="options.html#'scrollopt'">'scrollopt'</a>     没有 "hor"
        <a href="options.html#'wrap'">'wrap'</a>          打开，<a href="options.html#'diffopt'">'diffopt'</a> 包含 "followwrap" 时保持不变
        <a href="options.html#'foldmethod'">'foldmethod'</a>    "manual"
        <a href="options.html#'foldcolumn'">'foldcolumn'</a>    0

<a href="options.html#'foldenable'">'foldenable'</a> 极有可能复位为关闭。这是 <a href="options.html#'foldmethod'">'foldmethod'</a> 恢复为 "manual" 时进行的。
折叠本身虽然并不清除，但不应显示，复位 <a href="options.html#'foldenable'">'foldenable'</a> 是最好的办法。

</section><hr class="doubleline" /><section class=inner>
<h4>2. 查看比较结果                                         <b class="vimtag"> <a name="view-diffs">view-diffs</a> </b></h4>
比较产生的结果是，不同比较窗口显示同一文件不同版本，高亮标出差异的部分。当滚动
文本时，<a href="options.html#'scrollbind'">'scrollbind'</a> 选项将使得另一窗口的相应文本也随着滚动。垂直分割时，文本
会恰当地对齐。

不过，以下情况将使文本对齐出现问题:
- 当设置了 <a href="options.html#'wrap'">'wrap'</a> 后，一些行将被自动换行，在屏幕上占用两行以上。
- 一个缓冲区打开了折叠，另一个却没有。
- <a href="options.html#'scrollbind'">'scrollbind'</a> 被关闭
- 文本做过改动
- <a href="options.html#'diffopt'">'diffopt'</a> 中没有 "filler"，插入或删除的行会使对齐出错

所有打开 <a href="options.html#'diff'">'diff'</a> 选项并在某一个窗口编辑的缓冲区都将参与比较。即使对于一个隐藏的
缓冲区也是如此，如果它曾在一个窗口内被编辑过的话。要去除隐藏缓冲区，用
 <code class="badlink">:diffoff!</code> 。

                                        <b class="vimtag"> <a name=":DiffOrig">:DiffOrig</a> </b> <b class="vimtag"> <a name="diff-original-file">diff-original-file</a> </b>
因为 <a href="options.html#'diff'">'diff'</a> 是一个局部于窗口的选项，所以同一缓冲区可以在某一个窗口里是比较模
式，而在另一个窗口里则是普通模式。你也可能想查看对一缓冲区在读入文件后所做过的
改动。既然 Vim 不允许同一个文件有 2 个缓冲区，你需要另一个缓冲区。可用下面的命
令: 
<code class="example">         command DiffOrig vert new | set bt=nofile | r ++edit # | 0d_</code>
<code class="example">                \ | diffthis | wincmd p | diffthis</code>
( <a href="starting.html#defaults.vim">defaults.vim</a>  里有该示例)。之后，使用 ":DiffOrig" 就可以查看当前缓冲区和它刚
从文件里载入时的不同之处。

要 <code class="note">注意</code>: 已经卸载的缓冲区不能参与比较。但一个隐藏的缓冲区是可以的。你可以使用
":hide" 来关闭但不卸载窗口。如果你不想缓冲区继续参与比较，可以在隐藏前先执行
":set nodiff"。

                                                <b class="vimtag"> <a name=":dif">:dif</a> </b> <b class="vimtag"> <a name=":diff">:diff</a> </b> <b class="vimtag"> <a name=":diffupdate">:diffupdate</a> </b>
:dif[fupdate][!]                刷新比较结果的高亮和折叠。

在改变文本时，Vim 试图更新比较的结果。插入或删除行一般会得到正确的更新。但行内
或者更复杂的改动将无法如此。要强制刷新比较结果，使用: 
<code class="example"></code>
<code class="example">        :diffupdate</code>
<code class="example"></code>
包含 ! 时，Vim 会检查文件是否被外部改变而需要重新载入。对每个被改变的文件给出
提示，就像用了  <a href="editing.html#:checktime">:checktime</a>  那样。

一些行在本窗口没有，但却在一个窗口里出现。它们或者是在那个文件里新插入的，或者
是在本文件里刚删除的。对这些行，除非 <a href="options.html#'diffopt'">'diffopt'</a> 选项中不包含 "filler"，Vim 将在
本窗口对应的位置显示填充行。


折叠可以用来隐藏那些没有被更改过的文字。要知道所有用于折叠的命令，可以参考
 <a href="fold.html#folding">folding</a> 。

<a href="options.html#'diffopt'">'diffopt'</a> 选项还可以用来设置在差异文之前不被折叠的行数 (上下文)。如要把上下文
设为 3 行: 
<code class="example"></code>
<code class="example">        :set diffopt=filler,context:3</code>
<code class="example"></code>
<code class="example"></code>
以下的语法高亮群组可以用来显示比较的结果:

 <a href="syntax.html#hl-DiffAdd">hl-DiffAdd</a>     DiffAdd         添加 (插入) 的行。这些行只存在于本缓冲区里。
 <a href="syntax.html#hl-DiffChange">hl-DiffChange</a>  DiffChange      改动过的行。
 <a href="syntax.html#hl-DiffText">hl-DiffText</a>    DiffText        在改动行中被更改的文本。Vim 找到第一个和最后一
                                个不同的字符 (从行末开始搜起) 之间的文字，包括
                                其实没被改动的部分，都被高亮。这里只受到
                                <a href="options.html#'diffopt'">'diffopt'</a> 中的 "iwhite" 和 "icase" 标志位的影
                                响。
 <a href="syntax.html#hl-DiffDelete">hl-DiffDelete</a>  DiffDelete      被删除的行。也称为填充行，因为在本缓冲区里这些
                                行并不真正存在。

</section><hr class="doubleline" /><section class=inner>
<h4>3. 跳转到差异文                                         <b class="vimtag"> <a name="jumpto-diffs">jumpto-diffs</a> </b></h4>
有两条命令可用于在跳转到差异文所在的位置:
                                                                <b class="vimtag"> <a name="[c">[c</a> </b>
        [c              反向跳转至上一处更改的开始。计数前缀使之重复执行相应
                        次。
                                                                <b class="vimtag"> <a name="]c">]c</a> </b>
        ]c              正向跳转至下一个更改的开始。计数前缀使之重复执行相应
                        次。

如果不存在光标可以跳转到的更改，将产生错误。

</section><hr class="doubleline" /><section class=inner>
<h4>4. 复制差异文本                 <b class="vimtag"> <a name="copy-diffs">copy-diffs</a> </b> <b class="vimtag"> <a name="E99">E99</a> </b> <b class="vimtag"> <a name="E100">E100</a> </b> <b class="vimtag"> <a name="E101">E101</a> </b> <b class="vimtag"> <a name="E102">E102</a> </b> <b class="vimtag"> <a name="E103">E103</a> </b></h4>                                                                <b class="vimtag"> <a name="merge">merge</a> </b>
有两个命令可用来在两个缓冲区之间复制文本。相应的结果是，在一定的范围内两缓冲区
的内容被统一。

                                                        <b class="vimtag"> <a name=":diffg">:diffg</a> </b> <b class="vimtag"> <a name=":diffget">:diffget</a> </b>
:<code class="special">[range]</code>diffg[et] <code class="special">[bufspec]</code>
                用另一个缓冲区来修改当前的缓冲区，消除不同之处。除非只有另外一
                个比较模式下的缓冲区， <code class="special">[bufspec]</code> 必须存在并指定那个缓冲区。
                如果 <code class="special">[bufspec]</code> 指定的是当前缓冲区，则为空动作。
                <code class="special">[range]</code> 可以参考下面。

                                                <b class="vimtag"> <a name=":diffpu">:diffpu</a> </b> <b class="vimtag"> <a name=":diffput">:diffput</a> </b> <b class="vimtag"> <a name="E793">E793</a> </b>
:<code class="special">[range]</code>diffpu[t] <code class="special">[bufspec]</code>
                用当前缓冲区来修改另一个缓冲区，消除不同之处。不同于
                ":diffget" 之处仅在于被更改的是另一个缓冲区。
                如果忽略 <code class="special">[bufspec]</code>，而多于一个缓冲区处于比较模式并置位
                <a href="options.html#'modifiable'">'modifiable'</a> 的话，此命令失败。
                <code class="special">[range]</code> 可以参考下面。

                                                        <b class="vimtag"> <a name="do">do</a> </b>
<code class="special">[count]</code>do       同 ":diffget"，但没有范围。"o" 表示 "obtain" (不能用
                "dg"，因为那可能是 "dgg" 的开始！)。<code class="note">注意</code> 不适用于可视模式。
                给出的 <code class="special">[count]</code> 用作 ":diffget" 的 <code class="special">[bufspec]</code> 参数。

                                                        <b class="vimtag"> <a name="dp">dp</a> </b>
dp              同 ":diffput"，但没有范围。<code class="note">注意</code> 不适用于可视模式。
                给出的 <code class="special">[count]</code> 用作 ":diffput" 的 <code class="special">[bufspec]</code> 参数。

当没有给定 <code class="special">[range]</code> 时，受影响的仅是当前光标所处位置或其紧上方的差异文本。
当指定 <code class="special">[range]</code> 时，Vim 试图仅改动它指定的行。不过，当有被删除的行时，这不总有
效。

可能在最后一行之后有删除的行。要从另一个缓冲区中取得那些行，可使用最后一行的行
号加一来实现。以下命令从另一个缓冲区中得到所有的差异文本: 
<code class="example"></code>
<code class="example">        :1,$+1diffget</code>
<code class="example"></code>
<code class="note">注意</code>: 被删除的行会被显示，但不作为文本行看待。你也不能将光标移至其中。要用另一
个缓冲区来填充被删除的行，可在其下一行用 ":diffget"。
                                                                <b class="vimtag"> <a name="E787">E787</a> </b>
如果要修改的缓冲区只读，而  <a href="autocmd.html#FileChangedRO">FileChangedRO</a>  激活的自动命令要修改缓冲区，该命令
会失败。此时，自动命令不能修改缓冲区。

参数 <code class="special">[bufspec]</code> 可以是缓冲区的序号，匹配缓冲区名称或缓冲区名称的一部分的模式。
例如:

        :diffget                使用另一个进入比较模式的缓冲区
        :diffget 3              使用 3 号缓冲区
        :diffget v2             使用名字同 "v2" 匹配的缓冲区，并进入比较模式
                                (例如，"file.c.v2")

</section><hr class="doubleline" /><section class=inner>
<h4>5. diff 选项                                            <b class="vimtag"> <a name="diff-options">diff-options</a> </b></h4>
也可参考  <a href="options.html#'diffopt'">'diffopt'</a>  和  <a href="options.html#'fillchars'">'fillchars'</a>  中的 "diff" 项。

                                            <b class="vimtag"> <a name="diff-slow">diff-slow</a> </b> <b class="vimtag"> <a name="diff_translations">diff_translations</a> </b>
比较语法高亮对很长的行可能会较慢，尤其是因为它试图匹配各种本地化的文本。要关闭
本地化并提高语法高亮速度，设置全局变量 g:diff_translations 为零: 
<code class="example"></code>
<code class="example">    let g:diff_translations = 0</code>

设置此变量后，重新载入语法脚本: 
<code class="example"></code>
<code class="example">    set syntax=diff</code>



查 找 不 同                                             <b class="vimtag"> <a name="diff-diffexpr">diff-diffexpr</a> </b>

<a href="options.html#'diffexpr'">'diffexpr'</a> 选项可以用来设定不同于内部 diff 支持或标准 "diff" 程序的方法来比较
文件间的异同。 <b class="vimtag"> <a name="E959">E959</a> </b>

当 <a href="options.html#'diffexpr'">'diffexpr'</a> 为空的时候，Vim 使用以下命令在 file1 和 file2 中查找不同之处: 
<code class="example"></code>
<code class="example">        diff file1 file2 &gt; outfile</code>
<code class="example"></code>
其中的 "&gt;" 会用 <a href="options.html#'shellredir'">'shellredir'</a> 的值替换。

"diff" 的输出必须是普通的 "ed" 风格或合并风格 (unified) 的 diff。 <code class="emphasis">不能</code> 用上下
文 (context) 风格的 diff。而且合并风格的 diff 不能指定上下文行。"diff -u" <code class="emphasis">不</code> 
行，要用 "diff -U0"。

下面就是一个 Vim 所期望的 "ed" 风格的范例: 
<code class="example"></code>
<code class="example">        1a2</code>
<code class="example">        &gt; bbb</code>
<code class="example">        4d4</code>
<code class="example">        &lt; 111</code>
<code class="example">        7c7</code>
<code class="example">        &lt; GGG</code>
</section><hr class="singleline" /><section class=inner>
        &gt; ggg

"1a2" 项添加了 "bbb" 行。
"4d4" 项删除了 "111" 行。
"7c7" 项用 "ggg" 行替代了 "GGG" 行。

当 <a href="options.html#'diffexpr'">'diffexpr'</a> 不为空时，Vim 执行它以得到一个满足上述格式的 diff 文件。在执行过
程中，以下的变量会被设置为须用到的文件名:

        v:fname_in              原始文件
        v:fname_new             同一文件的新版
        v:fname_out             生成的 diff 文件的输出位置

另外，<a href="options.html#'diffexpr'">'diffexpr'</a> 应负责实现 <a href="options.html#'diffopt'">'diffopt'</a> 选项中的 "icase" 和 "iwhite" 。
而且，<a href="options.html#'diffexpr'">'diffexpr'</a> 不能更改 <a href="options.html#'lines'">'lines'</a> 和 <a href="options.html#'columns'">'columns'</a> 的值。

使用不带参数的函数调用的优点是更加速，见  <a href="vim9.html#expr-option-function">expr-option-function</a> 。

示例 (大致相当于 <a href="options.html#'diffexpr'">'diffexpr'</a> 为空时的行为): 
<code class="example"></code>
<code class="example">        set diffexpr=MyDiff()</code>
<code class="example">        function MyDiff()</code>
<code class="example">           let opt = ""</code>
<code class="example">           if &amp;diffopt =~ "icase"</code>
<code class="example">             let opt = opt .. "-i "</code>
<code class="example">           endif</code>
<code class="example">           if &amp;diffopt =~ "iwhite"</code>
<code class="example">             let opt = opt .. "-b "</code>
<code class="example">           endif</code>
<code class="example">           silent execute "!diff -a --binary " .. opt .. v:fname_in .. " " .. v:fname_new ..</code>
<code class="example">                \  " &gt; " .. v:fname_out</code>
<code class="example">           redraw!</code>
<code class="example">        endfunction</code>


其中，"-a" 参数被用来强制将文件作为文本来比较，二进制的比较没有什么意义。
"--binary" 参数使得文件以二进制模式读入，这样在 DOS 上 <code class="keystroke">CTRL-Z</code> 就不会结束文本。

 <code class="badlink">redraw!</code>  命令不一定必要，取决于执行外壳命令时是否会在屏幕上显示东西。

如果 <a href="options.html#'diffexpr'">'diffexpr'</a> 表达式以 s: 或  <a href="map.html#%3CSID%3E">&lt;SID&gt;</a>  开始，用脚本 ID ( <a href="userfunc.html#local-function">local-function</a> ) 代替
之。例如: 
<code class="example">                set diffexpr=s:MyDiffExpr()</code>
<code class="example">                set diffexpr=&lt;SID&gt;SomeDiffExpr()</code>
否则，表达式在设置此选项的脚本的上下文内进行计算，这样保证了局部于脚本的项目可
用。

                                                <b class="vimtag"> <a name="E810">E810</a> </b> <b class="vimtag"> <a name="E97">E97</a> </b>
Vim 将测试 diff 的输出看上去是否完全正确。如果不正确，你将得到一个错误信息。可
能是因为:
-  "diff" 程序无法执行。
-  "diff" 程序无法产生普通 "ed" 风格的 diff 文件 (参考上面)。
-  <a href="options.html#'shell'">'shell'</a> 和相关选项没有正确设置。试试类似 ":!sort" 过滤运行是否正确。
-  你设置的 <a href="options.html#'diffexpr'">'diffexpr'</a> 可能不正确。
如果问题出在哪里不是很清楚，可以设置 <a href="options.html#'verbose'">'verbose'</a> 选项为一或更高的值，以获得更多
的信息。

MS-Windows 自安装的 Vim 包含了 diff 程序。如果没有，您可以自行下载 diff.exe。
例如从这里
<a href="http://gnuwin32.sourceforge.net/packages/diffutils.htm">http://gnuwin32.sourceforge.net/packages/diffutils.htm</a>。


使 用 补 丁                                     <b class="vimtag"> <a name="diff-patchexpr">diff-patchexpr</a> </b>

选项 <a href="options.html#'patchexpr'">'patchexpr'</a> 可以用来设定非标准的 "patch" 程序。

当 <a href="options.html#'patchexpr'">'patchexpr'</a> 为空时，Vim 将这样调用 "patch" 程序: 
<code class="example"></code>
<code class="example">        patch -o outfile origfile &lt; patchfile</code>
<code class="example"></code>
对于大多数的 "patch" 程序版本，这都可以正确工作。 <code class="note">注意</code>: 在一行中间的 CR 可能产
生问题。它被当做一个换行符。

如果默认值无法使工作，设定 <a href="options.html#'patchexpr'">'patchexpr'</a> 使之有以上所述的同样的效果。它被执行
时，以下的变量会被设定为相关的文件名:

        v:fname_in              原始文件
        v:fname_diff            补丁文件
        v:fname_out             要生成的打过补丁的文件

使用不带参数的函数调用的优点是更加速，见  <a href="vim9.html#expr-option-function">expr-option-function</a> 。

示例 (对应 <a href="options.html#'patchexpr'">'patchexpr'</a> 为空时的行为): 
<code class="example"></code>
<code class="example">        set patchexpr=MyPatch()</code>
<code class="example">        function MyPatch()</code>
<code class="example">           :call system("patch -o " .. v:fname_out .. " " .. v:fname_in ..</code>
<code class="example">           \  " &lt; " .. v:fname_diff)</code>
<code class="example">        endfunction</code>
<code class="example"></code>
请确定使用 "patch" 程序时不会有不想要的副作用。比如，要留心那些生成的额外的文
件，用完之后应该将其删除。该程序应该仅仅给文件打补丁而没有别的作用。

使用 <a href="options.html#'patchexpr'">'patchexpr'</a> 的值之前， Vim 将改变当前目录到 "/tmp" 或别的临时目录。这是为
了让当前目录下的文件不被意外的打补丁。Vim 也将删除以 v:fname_in 开始以 ".rej"
和 ".orig" 结尾的文件。

如果 <a href="options.html#'patchexpr'">'patchexpr'</a> 表达式以 s: 或  <a href="map.html#%3CSID%3E">&lt;SID&gt;</a>  开始，用脚本 ID ( <a href="userfunc.html#local-function">local-function</a> ) 代
替之。例如: 
<code class="example">                set patchexpr=s:MyPatchExpr()</code>
<code class="example">                set patchexpr=&lt;SID&gt;SomePatchExpr()</code>
否则，表达式在设置此选项的脚本的上下文内进行计算，这样保证了局部于脚本的项目可
用。


 vim:tw=78:ts=8:noet:ft=help:norl:
</section>
</article>
<footer>
Generated by vim2html
</footer>
</body>
</html>
